+ [IAD-MIGRATION-120] Создать таблицу auth_db.sessions
Развертывание физической структуры таблиц пользователей и активных сессий в СУБД
NoteКраткая карточка задачи
- Репозиторий / Компонент:
auth-service(Базаauth_db, контур Identity & Auth / SECURITY). - Целевая СУБД: PostgreSQL v15+.
- Ссылка на Метод: Метод регистрации
- Статус: Готово к реализации
- Инструкция по шагам: Выполнить DDL-миграцию для создания таблицы реестра выданных долгоживущих refresh-сессий (
sessions) для контроля Сценариев 1, 2 и 3. В соответствии со спецификацией безопасности, в базу записывается строго криптографический хэш рефреш-токена, а не его сырое значение.
CREATE TABLE IF NOT EXISTS auth_db.sessions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES auth_db.users(id) ON DELETE CASCADE,
token_hash VARCHAR(64) UNIQUE NOT NULL, -- SHA-256 хэш от Refresh Token
device_fingerprint VARCHAR(255), -- Для контроля контекста и Breach Detection
ip_address VARCHAR(45),
is_revoked BOOLEAN DEFAULT false, -- Изменяется на true при Logout или компрометации
expires_at TIMESTAMP WITH TIME ZONE NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Индексы для оптимизации валидации и ротации токенов на Шаге 12
CREATE INDEX IF NOT EXISTS idx_sessions_token_lookup
ON auth_db.sessions (token_hash)
WHERE is_revoked = false AND expires_at > NOW();
CREATE INDEX IF NOT EXISTS idx_sessions_user_active
ON auth_db.sessions (user_id)
WHERE is_revoked = false;OLD
Для поддержки безопасного механизма обновления токенов и определения повторного использования угнанных ключей (Reuse Detection), база данных хранит метаданные сессий в изолированной таблице.
-- Таблица сессий и долгоживущих Refresh-токенов
CREATE TABLE user_sessions (
id BIGSERIAL PRIMARY KEY,
user_id VARCHAR(50) NOT NULL REFERENCES users(id) ON DELETE CASCADE,
token VARCHAR(512) NOT NULL UNIQUE, -- Хэш или тело Refresh-токена
is_revoked BOOLEAN NOT NULL DEFAULT FALSE,-- Флаг аннулирования токена (использован/украден)
expires_at TIMESTAMP WITH TIME ZONE NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Индекс для мгновенной верификации токена при фоновом обновлении Dio Interceptor
CREATE INDEX idx_user_sessions_lookup ON user_sessions(token) WHERE is_revoked = FALSE;